package cn.kgc.spring.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author 课工场
 * @date 2024/2/22
 * @description   基于jdk的动态代理
 */
public class JDKProxy {


    private Object  target;

    public JDKProxy(Object target){
        this.target = target;
    }

    // 获取代理对象
    public Object getProxy(){

        /*
        *  ClassLoader loader        类加载器   jvm虚拟不会为动态生成的代理类分配类加载器 需要借助第三方类加载器实现对象的创建
           Class<?>[] interfaces     被代理对象实现的所有的接口
           InvocationHandler h       业务功能增强代码封装对象
        * */

        ClassLoader classLoader = this.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();

        InvocationHandler invocationHandler = new InvocationHandler() {

            /*
            * Object proxy      代理对象
            * Method method     代理对象调用的方法对象
            * Object[] args     代理对象调用的方法传递的参数
            * */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {



                try {

                    // 连接点
                    System.out.println("上课时间到了，请开始上课");

                    // 执行目标方法
                    Object invoke = method.invoke(target, args);
                    // 连接点
                    System.out.println("下课时间到了，休息一下");
                    return invoke;
                }catch (Exception e){
                    // 连接点
                    throw  new RuntimeException();
                }finally {
                    // 连接点
                }


            }
        };

        // 使用jdk的代理方式  实现代理对象的创建
        Object o = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);

        return o;
    }

}
